package com.hzit.cart.service.impl;

import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
import com.hzit.cart.domain.ItemDTO;
import com.hzit.cart.interceptor.LoginInterceptor;
import com.hzit.cart.service.CartService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.system.api.RemoteManagerService;
import com.ruoyi.system.api.domain.Item;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 类名：
 * 作者：WF
 * 功能：
 */
@Service
public class CartServiceImpl implements CartService {

	@Autowired
	private RedisService redisService;
	@Autowired
	private RemoteManagerService managerService;
	@Autowired
	private RedisTemplate redisTemplate;
	/**
	 * 1. 添加商品到redis中(添加购物车)
	 * @param id
	 * @param num
	 */
	@Override
	public ItemDTO addCart(Long id, Integer num) {
		// 1.1 根据sku商品id，查询sku商品信息
		R<Item> r = managerService.findItemById(id);
		Item item = r.getData();
		// 1.2 判断在redis中是否有此商品
		ItemDTO dto = redisService.getCacheMapValue("hzit_cart:" + LoginInterceptor.local.get(), id + "");
		if(Objects.isNull(dto)){     // 代表没有此商品
			dto = new ItemDTO();
			BeanUtils.copyProperties(item,dto);
			dto.setBuyNum(num);      // 添加购买数量
		}else{                       // 代表有此商品,修改数量
			dto.setBuyNum(dto.getBuyNum() + num);
		}
		// 1.4 将修改后的商品添加到redis中
		redisService.setCacheMapValue("hzit_cart:" + LoginInterceptor.local.get(), id + "",dto);
		// 1.4 如果减少商品数量到0时，应该删除从购物车列表中删除此商品 (兼容处理)
		if (dto.getBuyNum() <= 0) {
			redisService.deleteCacheMapValue("hzit_cart:" + LoginInterceptor.local.get(),id + "");
		}
		return dto;
	}

	/**
	 * 从redis中取得购物车数据，并重新组织数据
	 * @return
	 */
	@Override
	public Map<String, List<ItemDTO>> findCartByLogin() {
		// 1. 从redis中得到所有购物项的值的集合
		List<ItemDTO> cacheList = redisTemplate.opsForHash().values("hzit_cart:" + LoginInterceptor.local.get());

		// 2. 将上面得到的cacheList转换为Map<String, List<ItemDTO>>
		Map<String, List<ItemDTO>> collect = cacheList.stream()
									.collect(Collectors.groupingBy(ItemDTO::getSeller));
		// Map<String, List<ItemDTO>> data = new HashMap<>();
		// collect.forEach((k,v) -> {
		// 	if(v.size() > 0){
		// 		data.put(k,v);
		// 	}
		// });
		return collect;
	}
}
